package com.css.fxfzaqbz.modules.assess1.service.impl;

import com.css.fxfzaqbz.modules.assess1.entity.DestoryAreaEntity;
import com.css.fxfzaqbz.modules.assess1.entity.MedianEntity;
import com.css.fxfzaqbz.modules.assess1.repository.DestoryAlgRepository;
import com.css.fxfzaqbz.modules.assess1.service.CountPopulationService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;

@Service
@Transactional(rollbackFor = Exception.class)
public class CountPopulationServiceImpl implements CountPopulationService {

    @Resource
    DestoryAlgRepository destoryAlgRepository;
    //        需紧急安置人数计算
//        公式:  T=(c+d+e/2)*b/a-f
//        式中，a为户均居住面积，b为户均人口，c为所有住宅房屋的毁坏面积，d为非简易房屋的严重破坏面积，
//        e为非简易房屋中等破坏面积与简易房屋破坏面积之和，f为死亡人数。
//        简易房屋：结构类型为砖木房屋、土结构房屋、木结构房屋、石结构房屋、其他结构，
//        非简易房屋：高层建筑、钢结构房屋、多层钢筋混凝土房屋、砌体房屋。
//      结构类型 0高层建筑 1钢结构 2多层钢筋混凝土结构 3砖混结构 4砖木结构 5土结构 6木结构 7石结构 8其他结构

    @Override
    public void count(List<MedianEntity> medianEntities) {
        for (MedianEntity medianEntity : medianEntities) {
            //c值
            BigDecimal c = BigDecimal.ZERO;
            //d值
            BigDecimal d = BigDecimal.ZERO;
            //e/2值
            BigDecimal e = BigDecimal.ZERO;
            //b/a的值
            BigDecimal x = BigDecimal.ONE.divide(medianEntity.getPerCapitaHouseArea(), 10, RoundingMode.HALF_UP);
            for (DestoryAreaEntity entity : medianEntity.getList()) {
                c = c.add(entity.getHhArea());
                e = e.add(entity.getZdArea());
                String type = entity.getStructureType();
                if ("1".equals(type) || "4".equals(type) || "6".equals(type) || "7".equals(type) || "9".equals(type)) {
                    d = d.add(entity.getZdArea());
                }
                e = e.divide(new BigDecimal("2"));
                BigDecimal add = c.add(d).add(e);
                BigDecimal T = add.multiply(x).subtract(medianEntity.getDeathNum()).setScale(0, BigDecimal.ROUND_HALF_UP);
                if (T.compareTo(BigDecimal.ZERO) == -1) {
                    T = BigDecimal.ZERO;
                }
                destoryAlgRepository.update(medianEntity.getId(), T.intValue());
            }
        }
    }
}
